package com.piggy.common.core.utils.map;

import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.piggy.common.core.exception.GlobalException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * 高德地图工具类
 *
 * @author fengxy
 * @date 2024/01/18 14:59
 **/
public class GaoDeMapUtil {

    private static final Logger log = LoggerFactory.getLogger(GaoDeMapUtil.class);

    private static String key = SpringUtil.getProperty("gaoDeMap.key");

    /**
     * 根据详细地址获取经纬度
     *
     * @author fengxy
     * @date 2024/01/18 15:04
     **/
    public static String getLngAndLat(String address) {
        log.info("【高德地图】开始获取【{}】经纬度", address);
        // 请求地址
        String url = "https://restapi.amap.com/v3/geocode/geo?key=" + GaoDeMapUtil.key + "&address=" + address.trim() + "&output=JSON";
        log.info("【高德地图】请求地址：{}", url);
        // 发起请求
        String responseStr = HttpUtil.get(url);
        log.info("【高德地图】响应结果：{}", responseStr);
        if (StrUtil.isBlank(responseStr)) {
            throw new GlobalException("【高德地图】响应结果为空");
        }
        // 转换响应结果
        JSONObject response = JSONUtil.parseObj(responseStr);
        // 返回结果状态值：返回值为 0 或 1，0 表示请求失败；1 表示请求成功。
        if (response.getInt("status") == 0) {
            log.error("【高德地图】请求失败：{}", response.getStr("info"));
            throw new GlobalException("【高德地图】请求失败：" + response.getStr("info"));
        }
        // 地理编码信息列表
        List<JSONObject> geocodes = response.getBeanList("geocodes", JSONObject.class);
        if (geocodes.size() > 0) {
            // 取第一条数据的经纬度
            String location = geocodes.get(0).getStr("location");
            log.info("【高德地图】获取到经纬度：{}", location);
            return location;
        } else {
            log.error("【高德地图】获取不到经纬度");
            throw new GlobalException("【高德地图】获取不到经纬度");
        }
    }

    /**
     * 驾车路径规划
     *
     * @author fengxy
     * @date 2024/01/18 15:04
     **/
    public static String routePlan(Float originLng, Float originLat, Float destinationLng, Float destinationLat) {
        return routePlan(originLng + "," + originLat, destinationLng + "," + destinationLat);
    }

    /**
     * 驾车路径规划
     *
     * @author fengxy
     * @date 2024/01/18 15:04
     **/
    public static String routePlan(String origin, String destination) {
        log.info("【高德地图】开始获取驾车路径规划，起点坐标：{}，终点坐标：{}", origin, destination);
        // 请求地址
        String url = "https://restapi.amap.com/v3/direction/driving?key=" + GaoDeMapUtil.key + "&origin=" + origin + "&destination=" + destination + "&output=JSON";
        log.info("【高德地图】请求地址：{}", url);
        // 发起请求
        String responseStr = HttpUtil.get(url);
        log.info("【高德地图】响应结果：{}", responseStr);
        if (StrUtil.isBlank(responseStr)) {
            throw new GlobalException("【高德地图】响应结果为空");
        }
        // 转换响应结果
        JSONObject response = JSONUtil.parseObj(responseStr);
        // 返回结果状态值：返回值为 0 或 1，0 表示请求失败；1 表示请求成功。
        if (response.getInt("status") == 0) {
            log.error("【高德地图】请求失败：{}", response.getStr("info"));
            throw new GlobalException("【高德地图】请求失败：" + response.getStr("info"));
        }
        // 驾车路径规划信息
        String route = response.getStr("route");
        if (StrUtil.isNotBlank(route)) {
            // 取第一条数据的经纬度
            log.info("【高德地图】驾车路径规划信息：{}", route);
            return route;
        } else {
            log.error("【高德地图】获取不到驾车路径规划信息");
            throw new GlobalException("【高德地图】获取不到驾车路径规划信息");
        }
    }
}